

pub fn reference_usage() {

    /*
    引用的最后一次调用时机很关键
    引用型变量的作用域是从它定义起到它最后一次使用结束
    一个所有权型变量的可变引用与不可变引用的作用域不能交叠
    同一个所有权型变量的可变借用之间的作用域也不能交叠

    同一时间的一个值只能是一个拥有者
    可变引用和不可变引用是可以同时存在
     */

    /*
    let mut a1 = 10u32;
    let b = &mut a1;
    let mut c = &b;
    let d = &mut c;
    ***d = 30;
    println!("{d}");
    */

    /*
    let s1 = String::from("I am a superman");
    foo(&s1);
    println!("{s1}");

    let mut s2 = s1.clone();
    foo_mut(&mut s2);
    println!("{s2} \n {s1}");
    */
    let mut a: u32 = 10;
    let b = &a;
    let c = &a;
    let d = &a;

    let c = "1";
    let d = "11";
    let b = "111";

    let e = &mut a;
    println!("{e}");
}

//所有权传入的函数
fn foo(s:&String) {
    println!("in fn foo: {s}");
}

//可变引用传入
fn foo_mut(s:&mut String) {
    s.push_str("aaaaaaaa");
}
//https://static001.geekbang.org/resource/image/41/8d/41cf986d8da00cce53436aba30e89e8d.jpg?wh=1732x1398